#pragma once
#include <iostream>
#include <string>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>

namespace jsonrpc
{
    /*封装spdlog*/
    std::shared_ptr<spdlog::logger> g_default_logger;
    static void Init_Logger(bool mode, const std::string &filename, int level)
    {

        if (mode == false)
        {
            /*创建日志器*/
            g_default_logger = spdlog::stdout_color_mt("sync_default-logger");
            /*设置刷新策略*/
            g_default_logger->set_level(spdlog::level::level_enum(level));
            // 设置立即刷新日志等级
            g_default_logger->flush_on(spdlog::level::level_enum(level));
        }
        else
        {
            g_default_logger = spdlog::basic_logger_mt("file-default--log", filename);
            g_default_logger->set_level((spdlog::level::level_enum)level);
            g_default_logger->flush_on((spdlog::level::level_enum)level);
        }
        /*设置日志输出格式*/
        g_default_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l]%v");
    }
    /*使用宏封装spdlog以获取文件名和行号*/

#define TRACE_LOG(format, ...)                                                                         \
    do                                                                                                 \
    {                                                                                                  \
        g_default_logger->trace(std::string("[{}][{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__); \
    } while (0)
#define DEBUG_LOG(format, ...)                                                                         \
    do                                                                                                 \
    {                                                                                                  \
        g_default_logger->debug(std::string("[{}][{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__); \
    } while (0)
#define INFO_LOG(format, ...)                                                                         \
    do                                                                                                \
    {                                                                                                 \
        g_default_logger->info(std::string("[{}][{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__); \
    } while (0)
#define ERROR_LOG(format, ...)                                                                                \
    do                                                                                                        \
    {                                                                                                         \
        g_default_logger->error(std::string("[{}][{}] ") + format + "\n", __FILE__, __LINE__, ##__VA_ARGS__); \
    } while (0)
#define WARN_LOG(format, ...)                                                                                \
    do                                                                                                       \
    {                                                                                                        \
        g_default_logger->warn(std::string("[{}][{}] ") + format + "\n", __FILE__, __LINE__, ##__VA_ARGS__); \
    } while (0)
#define FATAL_LOG(format, ...)                                                                                   \
    do                                                                                                           \
    {                                                                                                            \
        g_default_logger->critical(std::string("[{}][{}] ") + format + "\n", __FILE__, __LINE__, ##__VA_ARGS__); \
    } while (0)
}